import os
import jwt
from datetime import datetime, timedelta, timezone
from flask import Flask, request, jsonify

# --- Flask 应用初始化 ---
app = Flask(__name__)

# --- 配置 ---
# 从环境变量获取JWT密钥, 如果未设置则程序无法启动
try:
    JWT_SECRET = os.environ['AUTH_JWT_SECRET']
except KeyError:
    raise RuntimeError("错误: 环境变量 'AUTH_JWT_SECRET' 未设置。服务器无法启动。")


# --- 一个模拟的本地用户验证接口 ---
def validate_user_credentials(username, password):
    """
    这是一个模拟的验证函数。
    在真实世界中，这里可能会查询数据库或调用另一个服务。
    """
    print(f"正在验证用户: {username}")
    # 为了演示，我们硬编码一个有效用户
    if username == 'admin' and password == 'secret_password':
        print("用户验证成功。")
        return True
    print("用户验证失败。")
    return False


# --- API 路由 ---
@app.route('/login', methods=['POST'])
def login():
    """
    处理用户登录请求，验证成功后返回 JWT。
    """
    # 1. 获取请求体中的 JSON 数据
    data = request.get_json()
    if not data:
        return jsonify({"error": "无效的请求体，需要提供JSON数据"}), 400

    username = data.get('username')
    password = data.get('password')

    if not username or not password:
        return jsonify({"error": "请求体中必须包含 'username' 和 'password'"}), 400

    # 2. 访问本地接口验证用户数据
    if validate_user_credentials(username, password):
        # 3. 验证通过，构建 JWT
        payload = {
            "role": "db role", 
            'sub': username,  # subject, 通常是用户ID或用户名
            'iat': datetime.now(timezone.utc),  # issued at, 签发时间
            'exp': datetime.now(timezone.utc) + timedelta(hours=10)  # expiration, 过期时间 (10小时后)
        }
        token = jwt.encode(payload, JWT_SECRET, algorithm='HS256')
        print(f"为用户 {username} 生成JWT成功。")
        return jsonify({'token': token}), 200
    else:
        # 验证失败
        return jsonify({'error': '无效的凭证'}), 401


@app.errorhandler(404)
def page_not_found(e):
    """
    自定义404错误处理器，处理所有未定义的路径。
    """
    return jsonify({
        'message': '无效的请求。请使用 POST 方法访问 /login 路径。'
    }), 404

@app.errorhandler(405)
def method_not_allowed(e):
    """
    自定义405错误处理器，处理路径存在但方法不被允许的情况 (例如 GET /login)
    """
    return jsonify({
        'message': '无效的请求方法。请使用 POST 方法访问 /login 路径。'
    }), 405


# 这个入口主要用于本地开发，在 Docker 中我们将使用 Gunicorn
if __name__ == '__main__':
    # 注意: debug=True 不应该在生产环境中使用
    app.run(host='0.0.0.0', port=8383, debug=True)


